#include "blockQueue.hpp"
#include "cirQueue.hpp"
#include "Task.hpp"
#include <unistd.h>
#include <ctime>
#include <cstdlib>

static const int p_num = 5;
static const int c_num = 3;

void *productor(void *args)
{
    cirQueue<Task> *cq = static_cast<cirQueue<Task> *>(args);

    srand(time(nullptr) ^ pthread_self());
    while (true)
    {
        // 生产计算任务
        int x = rand() % 100 + 1;
        int y = rand() % 100 + 1;
        char opt = Task::getOperator(x + y);
        Task t(x, y, opt);

        // 输入计算任务
        cq->push(t);

        std::cout << "productor: " << t.equation() << "?" << std::endl;
    }
    return nullptr;
}

void *consumer(void *args)
{
    cirQueue<Task> *cq = static_cast<cirQueue<Task> *>(args);

    while (true)
    {
        sleep(1);
        // 输出任务
        Task t;
        cq->pop(&t);

        // 处理计算
        t();

        std::cout << "consumer: " << t.equation() << t.getResult() << std::endl;
    }
    return nullptr;
}

int main()
{
    cirQueue<Task> cq;

    // 1-1 cp

    pthread_t p, c;

    pthread_create(&p, nullptr, productor, &cq);
    pthread_create(&c, nullptr, consumer, &cq);

    pthread_join(p, nullptr);
    pthread_join(c, nullptr);

    // n-n cp

    // pthread_t p[p_num]; // 生产者
    // pthread_t c[c_num]; // 消费者

    // for (int i = 0; i < p_num; i++)
    // {
    //     pthread_create(p + i, nullptr, productor, &cq);
    // }

    // for (int i = 0; i < c_num; i++)
    // {
    //     pthread_create(c + i, nullptr, consumer, &cq);
    // }

    // for (int i = 0; i < p_num; i++)
    // {
    //     pthread_join(p[i], nullptr);
    // }

    // for (int i = 0; i < c_num; i++)
    // {
    //     pthread_join(c[i], nullptr);
    // }
    return 0;
}